关于SpringBoot如何优雅的全局异常处理 | 您所在的位置:网站首页 › springboot parent › 关于SpringBoot如何优雅的全局异常处理 |
SpringBoot全局异常准备说明:如果想直接获取工程那么可以直接跳到底部,通过链接下载工程代码。 开发准备 环境要求JDK:1.8SpringBoot:1.5.17.RELEASE 首先还是Maven的相关依赖: 《properties》 《project.build.sourceEncoding》UTF-8《/project.build.sourceEncoding》 《java.version》1.8《/java.version》 《maven.compiler.source》1.8《/maven.compiler.source》 《maven.compiler.target》1.8《/maven.compiler.target》 《/properties》 《parent》 《groupId》org.springframework.boot《/groupId》 《artifactId》spring-boot-starter-parent《/artifactId》 《version》1.5.17.RELEASE《/version》 《relativePath /》 《/parent》 《dependencies》 《!-- Spring Boot Web 依赖 核心 --》 《dependency》 《groupId》org.springframework.boot《/groupId》 《artifactId》spring-boot-starter-web《/artifactId》 《/dependency》 《!-- Spring Boot Test 依赖 --》 《dependency》 《groupId》org.springframework.boot《/groupId》 《artifactId》spring-boot-starter-test《/artifactId》 《scope》test《/scope》 《/dependency》 《dependency》 《groupId》com.alibaba《/groupId》 《artifactId》fastjson《/artifactId》 《version》1.2.41《/version》 《/dependency》 《/dependencies》 配置文件这块基本不需要更改,全局异常的处理只需在代码中实现即可。 代码编写 SpringBoot的项目已经对有一定的异常处理了,但是对于我们开发者而言可能就不太合适了,因此我们需要对这些异常进行统一的捕获并处理。SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。 我们根据下面的这个示例来看该注解是如何使用吧。 示例代码: @ControllerAdvice public class MyExceptionHandler { @ExceptionHandler(value =Exception.class) public String exceptionHandler(Exception e){ System.out.println(“未知异常!原因是:”+e); return e.getMessage(); } } 上述的示例中,我们对捕获的异常进行简单的二次处理,返回异常的信息,虽然这种能够让我们知道异常的原因,但是在很多的情况下来说,可能还是不够人性化,不符合我们的要求。那么我们这里可以通过自定义的异常类以及枚举类来实现我们想要的那种数据吧。 自定义基础接口类 首先定义一个基础的接口类,自定义的错误描述枚举类需实现该接口。代码如下: public interface BaseErrorInfoInterface { /** 错误码*/ String getResultCode(); /** 错误描述*/ String getResultMsg(); } 自定义枚举类 然后我们这里在自定义一个枚举类,并实现该接口。代码如下: public enum CommonEnum implements BaseErrorInfoInterface { // 数据操作错误定义 SUCCESS(“200”, “成功!”), BODY_NOT_MATCH(“400”,“请求的数据格式不符!”), SIGNATURE_NOT_MATCH(“401”,“请求的数字签名不匹配!”), NOT_FOUND(“404”, “未找到该资源!”), INTERNAL_SERVER_ERROR(“500”, “服务器内部错误!”), SERVER_BUSY(“503”,“服务器正忙,请稍后再试!”) ; /** 错误码 */ private String resultCode; /** 错误描述 */ private String resultMsg; CommonEnum(String resultCode, String resultMsg) { this.resultCode = resultCode; this.resultMsg = resultMsg; } @Override public String getResultCode() { return resultCode; } @Override public String getResultMsg() { return resultMsg; } } 自定义异常类 然后我们在来自定义一个异常类,用于处理我们发生的业务异常。代码如下: public class BizException extends RuntimeException { private static final long serialVersionUID = 1L; /** * 错误码 */ protected String errorCode; /** * 错误信息 */ protected String errorMsg; public BizException() { super(); } public BizException(BaseErrorInfoInterface errorInfoInterface) { super(errorInfoInterface.getResultCode()); this.errorCode = errorInfoInterface.getResultCode(); this.errorMsg = errorInfoInterface.getResultMsg(); } public BizException(BaseErrorInfoInterface errorInfoInterface, Throwable cause) { super(errorInfoInterface.getResultCode(), cause); this.errorCode = errorInfoInterface.getResultCode(); this.errorMsg = errorInfoInterface.getResultMsg(); } public BizException(String errorMsg) { super(errorMsg); this.errorMsg = errorMsg; } public BizException(String errorCode, String errorMsg) { super(errorCode); this.errorCode = errorCode; this.errorMsg = errorMsg; } public BizException(String errorCode, String errorMsg, Throwable cause) { super(errorCode, cause); this.errorCode = errorCode; this.errorMsg = errorMsg; } public String getErrorCode() { return errorCode; } public void setErrorCode(String errorCode) { this.errorCode = errorCode; } public String getErrorMsg() { return errorMsg; } public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } public String getMessage() { return errorMsg; } @Override public Throwable fillInStackTrace() { return this; } } 自定义数据格式 顺便这里我们定义一下数据的传输格式。代码如下: public class ResultBody { /** * 响应代码 */ private String code; /** * 响应消息 */ private String message; /** * 响应结果 */ private Object result; public ResultBody() { } public ResultBody(BaseErrorInfoInterface errorInfo) { this.code = errorInfo.getResultCode(); this.message = errorInfo.getResultMsg(); } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Object getResult() { return result; } public void setResult(Object result) { this.result = result; } /** * 成功 * * @return */ public static ResultBody success() { return success(null); } /** * 成功 * @param data * @return */ public static ResultBody success(Object data) { ResultBody rb = new ResultBody(); rb.setCode(CommonEnum.SUCCESS.getResultCode()); rb.setMessage(CommonEnum.SUCCESS.getResultMsg()); rb.setResult(data); return rb; } /** * 失败 */ public static ResultBody error(BaseErrorInfoInterface errorInfo) { ResultBody rb = new ResultBody(); rb.setCode(errorInfo.getResultCode()); rb.setMessage(errorInfo.getResultMsg()); rb.setResult(null); return rb; } /** * 失败 */ public static ResultBody error(String code, String message) { ResultBody rb = new ResultBody(); rb.setCode(code); rb.setMessage(message); rb.setResult(null); return rb; } /** * 失败 */ public static ResultBody error( String message) { ResultBody rb = new ResultBody(); rb.setCode(“-1”); rb.setMessage(message); rb.setResult(null); return rb; } @Override public String toString() { return JSONObject.toJSONString(this); } } 自定义全局异常处理类 最后我们在来编写一个自定义全局异常处理的类。代码如下: @ControllerAdvice public class GlobalExceptionHandler { private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); /** * 处理自定义的业务异常 * @param req * @param e * @return */ @ExceptionHandler(value = BizException.class) @ResponseBody public ResultBody bizExceptionHandler(HttpServletRequest req, BizException e){ logger.error(“发生业务异常!原因是:{}”,e.getErrorMsg()); return ResultBody.error(e.getErrorCode(),e.getErrorMsg()); } /** * 处理空指针的异常 * @param req * @param e * @return */ @ExceptionHandler(value =NullPointerException.class) @ResponseBody public ResultBody exceptionHandler(HttpServletRequest req, NullPointerException e){ logger.error(“发生空指针异常!原因是:”,e); return ResultBody.error(CommonEnum.BODY_NOT_MATCH); } /** * 处理其他异常 * @param req * @param e * @return */ @ExceptionHandler(value =Exception.class) @ResponseBody public ResultBody exceptionHandler(HttpServletRequest req, Exception e){ logger.error(“未知异常!原因是:”,e); return ResultBody.error(CommonEnum.INTERNAL_SERVER_ERROR); } } 因为这里我们只是用于做全局异常处理的功能实现以及测试,所以这里我们只需在添加一个实体类和一个控制层类即可。 实体类 又是万能的用户表 (^▽^) 代码如下: public class User implements Serializable{ private static final long serialVersionUID = 1L; /** 编号 */ private int id; /** 姓名 */ private String name; /** 年龄 */ private int age; public User(){ } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { return JSONObject.toJSONString(this); } } Controller 控制层 控制层这边也比较简单,使用Restful风格实现的CRUD功能,不同的是这里我故意弄出了一些异常,好让这些异常被捕获到然后处理。这些异常中,有自定义的异常抛出,也有空指针的异常抛出,当然也有不可预知的异常抛出(这里我用类型转换异常代替),那么我们在完成代码编写之后,看看这些异常是否能够被捕获处理成功吧! 代码如下: @RestController @RequestMapping(value = “/api”) public class UserRestController { @PostMapping(“/user”) public boolean insert(@RequestBody User user) { System.out.println(“开始新增。。。”); //如果姓名为空就手动抛出一个自定义的异常! if(user.getName()==null){ throw new BizException(“-1”,“用户姓名不能为空!”); } return true; } @PutMapping(“/user”) public boolean update(@RequestBody User user) { System.out.println(“开始更新。。。”); //这里故意造成一个空指针的异常,并且不进行处理 String str=null; str.equals(“111”); return true; } @DeleteMapping(“/user”) public boolean delete(@RequestBody User user) { System.out.println(“开始删除。。。”); //这里故意造成一个异常,并且不进行处理 Integer.parseInt(“abc123”); return true; } @GetMapping(“/user”) public List《User》 findByUser(User user) { System.out.println(“开始查询。。。”); List《User》 userList =new ArrayList《》(); User user2=new User(); user2.setId(1L); user2.setName(“xuwujing”); user2.setAge(18); userList.add(user2); return userList; } } App 入口 和普通的SpringBoot项目基本一样。 代码如下: @SpringBootApplication public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); System.out.println(“程序正在运行。。。”); } } 功能测试 我们成功启动该程序之后,使用Postman工具来进行接口测试。 首先进行查询,查看程序正常运行是否ok,使用GET 方式进行请求。 “ GET http://localhost:8181/api/user ”返回参数为: “ {“id”:1,“name”:“xuwujing”,“age”:18} ”示例图:
可以看到程序正常返回,并没有因自定义的全局异常而影响。 然后我们再来测试下自定义的异常是否能够被正确的捕获并处理。 使用POST方式进行请求 “ POST http://localhost:8181/api/user ”Body参数为: “ {“id”:1,“age”:18} ”返回参数为: “ {“code”:“-1”,“message”:“用户姓名不能为空!”,“result”:null} ”示例图:
可以看出将我们抛出的异常进行数据封装,然后将异常返回出来。 然后我们再来测试下空指针异常是否能够被正确的捕获并处理。在自定义全局异常中,我们除了定义空指针的异常处理,也定义最高级别之一的Exception异常,那么这里发生了空指针异常之后,它是回优先使用哪一个呢?这里我们来测试下。 使用PUT方式进行请求。 “ PUT http://localhost:8181/api/user ”Body参数为: “ {“id”:1,“age”:18} ”返回参数为: “ {“code”:“400”,“message”:“请求的数据格式不符!”,“result”:null} ”示例图:
我们可以看到这里的的确是返回空指针的异常护理,可以得出全局异常处理优先处理子类的异常。 那么我们在来试试未指定其异常的处理,看该异常是否能够被捕获。 使用DELETE方式进行请求。 “ DELETE http://localhost:8181/api/user ”Body参数为: “ {“id”:1} ”返回参数为: “ {“code”:“500”,“message”:“服务器内部错误!”,“result”:null} ” 这里可以看到它使用了我们在自定义全局异常处理类中的Exception异常处理的方法。到这里,测试就结束了。顺便再说一下,自义定全局异常处理除了可以处理上述的数据格式之外,也可以处理页面的跳转,只需在新增的异常方法的返回处理上填写该跳转的路径并不使用ResponseBody 注解即可。 细心的同学也许发现了在GlobalExceptionHandler类中使用的是ControllerAdvice注解,而非RestControllerAdvice注解,如果是用的RestControllerAdvice注解,它会将数据自动转换成JSON格式,这种于Controller和RestController类似,所以我们在使用全局异常处理的之后可以进行灵活的选择处理。 其它关于SpringBoot优雅的全局异常处理的文章就讲解到这里了,如有不妥,欢迎指正! 项目地址 SpringBoot全局异常的处理项目工程地址//github.com/xuwujing/springBoot-study/tree/master/springboot-exceptionHandler 编辑;jq 原文标题:看看人家SpringBoot的全局异常处理多么优雅... 文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。 收藏 人收藏扫一扫,分享给好友 复制链接分享 评论发布评论请先 登录 相关推荐 详解#define的奇妙用法 在 C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译.... STM32嵌入式开发 发表于 03-22 09:03 • 66次 阅读 如何使用 go 实现红黑树 二叉查找树也叫二叉搜索树,也叫二叉排序树,它具有以下特点:1. 如果左子树不为空,则左子树上的结点的.... Linux爱好者 发表于 03-21 11:54 • 154次 阅读 Go语言的默认机制 不过麻烦的事情来了。我们写一个程序,就是想在别人的电脑上运行的。然而,Go语言的默认机制,会泄漏我们.... Linux爱好者 发表于 03-21 11:50 • 180次 阅读 测试自动化的两种方法 许多测试自动化工具提供了记录和回放功能,允许用户交互式地记录用户操作,并回放任何次数,并将实际结果与.... 汽车电子硬件设计 发表于 03-21 10:56 • 99次 阅读 与OpenHarmony相关的三场技术直播 因为突发的疫情,我们的生活按下了“慢行键”,大家现在的工作状态如何呢?anyway,希望大家都保持积.... 发烧友研习社 发表于 03-20 13:44 • 253次 阅读 占位面积很小的自定义进度指示器progressbutton 概述 1、描述:progressbutton是占位面积很小的自定义进度指示器。默认实现提供了一个pi.... 发表于 03-18 14:45 • 4次 阅读 介绍assert的使用方法 很多业务场景需要我们某一特定的时刻去做某件任务,定时任务解决的就是这种业务场景。一般来说,系统可以使.... Linux爱好者 发表于 03-17 14:06 • 214次 阅读 如何使用 Compose 进行构建 适用于 Wear OS 的 Compose 已推出了开发者预览版,使用 Compose 构建 Wea.... 谷歌开发者 发表于 03-17 13:44 • 218次 阅读 CFI的基本概念 控制流劫持是一种危害性极大的攻击方式,攻击者能够通过它来获取目标机器的控制权,甚至进行提权操作,对目.... Linux阅码场 发表于 03-17 13:36 • 161次 阅读 OpenHarmony应用开发为什么不首选C/C++作为应用开发语言呢 OpenHarmony本来就是C和C++开发的,支持C/C++语言环境。应用开发为什么不首选C/C++作为应用开发语言。 1、相对于其他开... 发表于 03-17 10:30 • 926次 阅读 在CPU上如何同时尝试 getrandom Jason Donenfeld 是 WireGuard 的主要开发者,同时他也是 Linux 内核随.... Linux爱好者 发表于 03-16 17:19 • 597次 阅读 基础算法:差分数组详解 前文说前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。 算法与数据结构 发表于 03-16 15:57 • 468次 阅读 如何用 Markdown 来做 PPT 相信绝大多数朋友做 PPT(幻灯片 / Slides / Deck 等各种称呼了)都是用的 Powe.... 数据分析与开发 发表于 03-16 14:10 • 139次 阅读 关于指数对比度增强FPGA实现 对比度增强是个广泛的话题,前文中关于直方图均衡的方法,其实就是一种对比度增强。而对比度增强,就是提高.... FPGA技术江湖 发表于 03-16 11:46 • 175次 阅读 解析数据结构的常用七大排序算法 为了让大家掌握多种排序方法的基本思想,本篇文章带着大家对数据结构的常用七大算法进行分析:包括直接插入.... C语言编程学习基地 发表于 03-16 08:22 • 164次 阅读 从C 到 matlab 到 FPGA,如何实现CNN的项目 经过了前面的开胃菜,项目正式开始。一步步讲解这个模型怎么玩起来的。从C 到 matlab 到 FPG.... FPGA攻城狮之家 发表于 03-15 17:13 • 667次 阅读 润和鸿蒙系列开发板资料总结(原理图+源代码+教程) 1、润和 HH-SCDAYU200 鸿蒙开发套件 简介:基于Rockchip RK3568,集成双核心架构GPU以及高效能NPU;板载四核6... 发表于 03-15 16:40 • 11916次 阅读 使用Trace View对对Kernel进行性能仿真分析 对Kernel进行性能分析需要对其进行仿真,同时还要用到Vitis Analyzer。为便于说明,我.... TeacherGaoFPGAHub 发表于 03-15 15:30 • 229次 阅读 怎样去处理OpenHarmony执行hb命令报错的问题呢 在执行hb命令的时候报错: 重新安装环境,在安装hb的时候出现下面的问题警告: 处理方式:在openharmony 代码根目录下使用... 发表于 03-15 14:33 • 657次 阅读 assign组合逻辑和always@(*)组合逻辑的区别 1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合.... FPGA之家 发表于 03-15 14:08 • 221次 阅读 Verilog系统函数和边沿检测 “ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括Verilog仿真时常用的系统.... FPGA之家 发表于 03-15 13:34 • 135次 阅读 什么是“三字母词” 在ANSI标准中,定义了“三字母词”,或者成为“三联符序列”,英文为"trigraph sequen.... STM32嵌入式开发 发表于 03-15 09:27 • 119次 阅读 一种简单的OpenHarmony环境搭建方法 本文介绍一种简单的OpenHarmony环境搭建方法。 HarmonyOS官方合作社区 发表于 03-14 13:58 • 1401次 阅读 如何快速学习并精通C语言 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文.... 嵌入式ARM 发表于 03-12 11:59 • 434次 阅读 代码和bug就是一个此消彼长、相互依赖的过程 经常听一些朋友说道:"你写的代码没有bug,那你离丢饭碗不远了",又或者代码中故意保留一些bug来增.... 硬件攻城狮 发表于 03-11 10:01 • 166次 阅读 如何实现软硬件分层 以STM32为例,打开网络上下载的例程或者是购买开发板自带的例程,都会发现应用层中会有stm32f1.... strongerHuang 发表于 03-10 17:32 • 543次 阅读 如何快速排查IO异常输出问题 在嵌入式开发过程中,IO 操作是不可避免的,很多时候 IO 操作很正常,但有些时候可能因为某些原因导.... strongerHuang 发表于 03-09 17:55 • 787次 阅读 C/C++在线编译器的功能 作为程序员,使用编译器是必备技能,但是从入门到放弃,基本上就是在开发环境安装、配置这一步。。。 strongerHuang 发表于 03-09 17:52 • 3581次 阅读 有效提高编译速度的方法 今天就来说说嵌入式软件开发中,常见的提高编译速度的一些操作或者方法。 strongerHuang 发表于 03-09 17:31 • 703次 阅读 采用FMDft61t133芯片点亮LED的代码 由于目前本人零时朝8bit单片机方向走所以其内容接下来也是8bit单片机。 互联网电子设计 发表于 03-09 09:19 • 1587次 阅读 乘数智之风,超越单一视角 为世界造舟筏 女性在当下如何创造? 随着女性意识、女性购买力的不断上升,女性营销也以燎原之势在各大品牌中流行开来。三八节还没到,就有不少.... 脑极体 发表于 03-09 09:16 • 836次 阅读 python私有变量和私有方法 python私有变量和私有方法 1. 下划线妙用 在 Python 中,下划线可是非常推荐使用的符号.... python爬虫知识分享 发表于 03-08 16:30 • 460次 阅读 HiHope开发者问题答疑2 1. hi3861 小车寻迹和避障的代码 https://gitee.com/hihope_iot/hispark-pegasus-smart-car/tree/master 2.Pegasus智能家居开发... 发表于 03-07 20:28 • 1829次 阅读 无代码数字中台能否成为替代OA的存在 英国政治家切斯特菲尔德说过:“效率是做好工作的灵魂。”我想各行各业的管理者应该都体会颇深,不管是行业.... 发表于 03-04 10:06 • 20次 阅读 怎样写一个shell脚本以实现Android7.1.2源码的自动编译呢 怎样写一个shell脚本以实现Android7.1.2源码的自动编译呢? ... 发表于 03-04 06:32 • 126次 阅读 如何较为高效地完成多语言跨平台测试 针对软件静态测试,ISO26262标准的Part 6部分给出了具体要求说明,随着各大整车厂和供应商静.... 经纬恒润 发表于 03-03 12:39 • 391次 阅读 如何在Ota服务器上安装JDK版本呢 如何在Ota服务器上安装JDK版本呢?具体安装步骤有哪些?... 发表于 03-03 12:15 • 484次 阅读 ADS7886实用FPGA驱动代码 ADS7886驱动代码 Verilog 含注释超简单易懂易应用 发表于 03-03 09:41 • 29次 阅读 如何添加一个自己的软件包 本文简单介绍Hi3861WiFi操作,怎么连接到热点,查看IP,ping服务器等。 HarmonyOS官方合作社区 发表于 03-03 09:22 • 458次 阅读 利用华秋DFM快速分析PCB中潜在问题 软件代码有bug,可以通过人工查找,也可以通过编译发现,同时也可以通过代码静态分析工具找到错误或警告.... 发烧友研习社 发表于 03-02 14:29 • 368次 阅读 OpenHarmony开发环境搭建方法 本文介绍一种简单的OpenHarmony环境搭建方法。 电子发烧友论坛 发表于 03-02 13:49 • 358次 阅读 详解python普通函数创建与调用 函数是一种仅在调用时运行的代码块。您可以将数据(称为参数)传递到函数中,然后由函数可以把数据作为结果.... python爬虫知识分享 发表于 03-01 16:32 • 319次 阅读 基于STM32设计的拼图小游戏详解 拼图游戏在小时候还是经常玩,玩法也比较简单,这里就使用STM32设计一个拼图小游戏分享出来一起学习。.... DS小龙哥-嵌入式技术 发表于 02-28 13:45 • 307次 阅读 Docker镜像制作教程:针对不同语言的精简策略 简介: 本文主要讲解针对不同的语言来选择适当的精简策略,其中主要讨论 Go,同时也涉及到了 Java.... 发表于 02-28 08:40 • 23次 阅读 怎样去设计一个基于STM32F103RCT6的跑马灯 基于STM32F103RCT6的跑马灯关于STM32F103RCT6代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式... 发表于 02-25 07:26 • 201次 阅读 总结一下用单片机做项目时代码的架构 总结一下用单片机做项目时代码的架构 发表于 02-24 07:21 • 131次 阅读 共阳数码管数字1的显示实现 一、电路图段选位选通过Y6选择八个数码管的一个或多个,再通过Y7进行数码管的显示。段码:共阳数码管数字1的显示:dp=1 g=1 f=... 发表于 02-24 06:30 • 269次 阅读 4个Python经典项目实战,练手必备! Python是一种极具可读性和通用性的编程语言。Python这个名字的灵感来自于英国喜剧团体Mont.... 叶枫架构师 发表于 02-23 17:06 • 317次 阅读 硬件工程师必知的10个C语言技巧 硬件设计师最常见的工作内容,就是通过写代码来测试硬件。这10个C语言技巧(C语言仍然是常见的选择)可.... 凡亿PCB 发表于 02-23 15:35 • 442次 阅读 STM32CubeMX用户手册 STM32CubeMX用户手册免费下载。 发表于 02-22 14:03 • 88次 阅读 如何对RV1109 buildroot增加串口屏进行测试呢 如何对RV1109 buildroot增加串口屏进行测试呢?其结果怎样?... 发表于 02-21 07:00 • 778次 阅读 Xilinx SystemVerilog中的基本联合体 在 SystemVerilog 中,联合体只是信号,可通过不同名称和纵横比来加以引用。 其工作方式为.... 赛灵思 发表于 02-19 19:01 • 211次 阅读 原生开发如何学习Flutter 给原生 Android/ iOS 开发介绍如何正确学习和使用 Flutter 谷歌开发者 发表于 02-18 18:43 • 514次 阅读 一个工程师关于FPGA项目的感言 一个工程师有关FPGA项目的9个感言 赛灵思 发表于 02-16 16:21 • 497次 阅读 Vitis软核固化代码流程说明 在搭建完Block Design以及硬件代码后,生成bit;bit文件生成成功后,点击Export .... 赛灵思 发表于 02-16 16:21 • 128次 阅读 基于C51的秒表设计(内含程序代码) 基于C51的秒表设计(内含程序代码) 发表于 02-15 14:13 • 47次 阅读 Robei EDA下载 Robei推出最新的Robei 3.5.5 版本,采用工业级标准的设计与仿真,让EDA设计不再繁杂。 发表于 02-12 17:14 • 97次 阅读 单片机启动代码的认识 启动代码通常都烧写在flash中,它是系统一上电就执行的一段程序,它运行在任何用户c代码之前。上电后.... 发表于 02-11 17:15 • 112次 阅读 Visual Studio Code Java的更新特性 大家好,欢迎来到 Visual Studio Code Java 更新 1 月版!这是我们新年的第一.... 微软科技 发表于 02-10 15:57 • 419次 阅读 单片机低功耗设计案例分析 经过了多年的低功耗硬件设计(公司硬件设计和软件设计是分开的,我一直是做硬件,在面对低功耗生产事故中做.... 硬件攻城狮 发表于 02-10 11:31 • 447次 阅读 |
CopyRight 2018-2019 实验室设备网 版权所有 |